#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDebug>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    //自定义类对象，不能指定父对象
    myT = new MyThread;//由于没有指定父对象，故需要单独释放内存!!!
    //创建子线程
    thread = new QThread(this);
    //把自定义的线程加入到子线程中
    myT->moveToThread(thread);

    connect(myT,&MyThread::mySignal,this,&MyWidget::dealSignal);
    qDebug() << "主线程号" << QThread::currentThread();

    connect(this,&MyWidget::startThread,myT,&MyThread::myTimeout);
    connect(this,&MyWidget::destroyed,this,&MyWidget::dealClose);//窗口关闭时结束进程

    //线程处理函数内部，不允许操作图形界面！！！！！！！

    //connect()第五个参数的作用，连接方式：默认，队列，直接
    //多线程时才有意义
    //如果是多线程，默认使用队列
    //如果是单线程，默认使用直接方式
    //队列：槽函数所在的线程和接受者一致
    //直接：槽函数所在线程和发送者一样
}

MyWidget::~MyWidget()
{
    delete ui;
}

void MyWidget::on_buttonStart_clicked()
{
    if(thread->isRunning() == true)//不在运行时才启动,在运行时直接return
    {
        return;
    }

    //启动线程，但没有启动线程处理函数
    thread->start();
    myT->setFlag(false);
    //不能直接调用线程处理函数
    //直接调用会导致线程处理函数和主线程在同一线程上
    //即不能使用myT->myTimeout();
    //只能通过信号和槽的方式调用
    emit startThread();
}

void MyWidget::dealSignal()
{
   static int i = 0;
   i++;
   ui->lcdNumber->display(i);
}

void MyWidget::on_buttonStop_clicked()
{
    if(thread->isRunning() == false)//如果不在运行，直接返回
    {
        return;
    }

    myT->setFlag(true);
    thread->quit();//线程把手头工作处理完才关闭，但此处是while死循环处理不完
    thread->wait();
}

void MyWidget::dealClose()
{
    myT->setFlag(true);
    thread->quit();//线程把手头工作处理完才关闭，但此处是while死循环处理不完
    thread->wait();

    delete myT;
}
